package com.sky.controller.user;

import com.aliyun.oss.ServiceException;
import com.sky.mapper.user.UserOrderMapper;
import com.sky.pojo.Orders;
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.service.payments.model.Transaction;
import com.wechat.pay.java.service.payments.nativepay.NativePayService;
import com.wechat.pay.java.service.payments.nativepay.model.QueryOrderByOutTradeNoRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 下单任务
 */

@RestController
@Slf4j
public class OrderPayStatus {

    @Autowired
    public UserOrderMapper orderMapper;

    @Autowired
    public Config config;// 注意选择导包：com.wecha.pay.java.core


    @Scheduled(cron = "0 0/1 * * * ?")//每一分钟找一次
    public void checkOrderPayStatus() {
        log.info("执行支付超时订单任务开始");
        long start = System.currentTimeMillis(); //获取当前时间
        //去数据库里找：找打一直处于待支付的订单 在15分钟之前的
        LocalDateTime before15Min = LocalDateTime.now().minusMinutes(15);//.minusMinutes(15)计算15分钟之前的，也有计算15分钟之后的方法
        //去数据库找到15分钟之前未支付的所有订单
        List<Orders> ordersList = orderMapper.getCheckPayStartOrders(before15Min);
        //判断集合是否为空（1.空，就停止）（2.不为空遍历集合）
        if (CollectionUtils.isEmpty(ordersList)) {
            log.info("没有需要处理的订单");
            return;
        }  //遍历集合，判断支付状态，（支付状态可单独写一个bolle类型的返回方法去获取）
        for (Orders orders : ordersList) {
            //根据订单号（唯一）去微信获取支付结果状态   （想知道状态，必须调用微信接口返回的状态，因为支付成功与否后端是不知道的，只有微信和客户在知道）
            Boolean payStatus = getPayStatusFrom(orders.getNumber());
            //已支付的更改设置状态已支付状态 支付时间
            if (payStatus) {
                //设置订单状态
                orders.setPayStatus(Orders.PAID);//支付状态 （已支付）
                orders.setStatus(Orders.TO_BE_CONFIRMED);//用户付款状态（付款成功，等待商家接单）
                //再去数据库中去更改
                orderMapper.upPayStatusOk(orders);
                //未支付的更改状态 设置取消订单 和取消时间 取消原因
            } else {
                orders.setStatus(Orders.UN_PAID);//未支付
                orders.setPayStatus(Orders.CANCELLED_ORDER);
                orders.setRejectionReason("支付超时，已取消");
                //再去更改数据库的订单信息
                orderMapper.upPayStatusNo(orders);
            }
        }

        long end = System.currentTimeMillis();
        Long time = end - start;
        //计算所用的时间，日志打印
        log.info("执行支付超时订单任务，耗时为{}秒", time);
    }


    /**
     * 获取微信 订单支付状态
     * @param orderNumber
     * @return
     */
    public Boolean getPayStatusFrom(String orderNumber) {
        try {
            //创建微信支付的查询接口
            QueryOrderByOutTradeNoRequest request = new QueryOrderByOutTradeNoRequest();
            request.setMchid("1561414331");//设置商家ID
            request.setOutTradeNo(orderNumber);//传入订单号

            //创建微信支付的返回对象的接口
            NativePayService payService = new NativePayService.Builder().config(config).build();
            //用对象去调用接口 传入参数 获得 需要查询对象 的结果 （返回数据）
            Transaction transaction = payService.queryOrderByOutTradeNo(request);
            log.info("调用微信查询接口返回：{}", transaction);
            //根据返回的数据，对比是否为成功SUCCESS
            //微信返回接口的对象的一个参数                  去比较        微信返回微信接口里的枚举参数     是否一致  为SUCCESS 则成功
            if (transaction.getTradeState().equals(Transaction.TradeStateEnum.SUCCESS)) {
                return true;
            }
        } catch (ServiceException e) {
            if (e.getErrorCode().equals("ORRER_NOT_EXIST")) {
                log.info("微信订单不存在，没有发起过支付");
                return false;
            }

        } return false;
    }
}